#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>

#include <stdio.h>
#include "controladorservicios.h"
#include "servicio.h"
#include "serviciogui.h"
#include "spriteanimado.h"
//#include "IDClases.h"

void CrearServicio( gge::ControladorServicios *controller )
{
	gge::Servicio *miServicio = new gge::Servicio();
	
	controller->AgregarServicio(miServicio);
}

void CrearServicioGUI( gge::ControladorServicios *controller )
{
	gge::ServicioGUI *miServicio = new gge::ServicioGUI();
	
	controller->AgregarServicio((gge::Servicio*)miServicio);
}

void RegistrarServicios()
{
}
	
gge::Secuencia nuevaSecuencia(/*gge::SpriteAnimado &anim*/)
{
	gge::Secuencia sec;

	sf::Image Image1,Image2,Image3,Image4, Image5, Image6,
			Image7,Image8,Image9,Image0,Imagea,Imageb;
	
	if (Image1.LoadFromFile("../media/advance01.jpg"))
	{
		sf::Sprite sprite(Image1);
		sec.listaFrames.push_back(sprite);
	}
	if (Image2.LoadFromFile("../media/advance02.jpg"))
	{
		sf::Sprite sprite(Image2);
		sec.listaFrames.push_back(sprite);
	}
	if (Image3.LoadFromFile("../media/advance03.jpg"))
	{
		sf::Sprite sprite(Image3);
		sec.listaFrames.push_back(sprite);
	}
	if (Image4.LoadFromFile("../media/advance04.jpg"))
	{
		sf::Sprite sprite(Image4);
		sec.listaFrames.push_back(sprite);
	}
	if (Image5.LoadFromFile("../media/advance05.jpg"))
	{
		sf::Sprite sprite(Image5);
		sec.listaFrames.push_back(sprite);
	}
	
	if (Image6.LoadFromFile("../media/advance06.jpg"))
	{
		sf::Sprite sprite(Image6);
		sec.listaFrames.push_back(sprite);
	}
	if (Image7.LoadFromFile("../media/advance07.jpg"))
	{
		sf::Sprite sprite(Image7);
		sec.listaFrames.push_back(sprite);
	}
	if (Image8.LoadFromFile("../media/advance08.jpg"))
	{
		sf::Sprite sprite(Image8);
		sec.listaFrames.push_back(sprite);
	}
	if (Image9.LoadFromFile("../media/advance09.jpg"))
	{
		sf::Sprite sprite(Image9);
		sec.listaFrames.push_back(sprite);
	}
	if (Image0.LoadFromFile("../media/advance10.jpg"))
	{
		sf::Sprite sprite(Image0);
		sec.listaFrames.push_back(sprite);
	}
	if (Imagea.LoadFromFile("../media/advance11.jpg"))
	{
		sf::Sprite sprite(Imagea);
		sec.listaFrames.push_back(sprite);
	}
	if (Imageb.LoadFromFile("../media/advance12.jpg"))
	{
		sf::Sprite sprite(Imageb);
		sec.listaFrames.push_back(sprite);
	}
	 
	sec.duracion =12;
	sec.nombre="advance";
	//anim.AgregarSecuencia(sec);
	return sec;
}

int main()
{
	printf ("Inicio\n");
	
	// Create the main window
	sf::RenderWindow App(sf::VideoMode(800, 600), "SFML window");
	
	// Load a sprite to display
	sf::Image Image1, Image2, Image3, Image4, Image5, Image6, Image7, Image8, Image9, Image10, Image11, Image12;
	if (!Image1.LoadFromFile("../media/advance01.png"))
		return EXIT_FAILURE;
	sf::Sprite Sprite(Image1);
	
	// Create a graphical string to display
	sf::Font Arial;
	if (!Arial.LoadFromFile("../media/arial.ttf"))
		return EXIT_FAILURE;
	sf::String Text("Hello SFML", Arial, 50);
	
	// Load a music to play
	sf::Music Music;
	if (!Music.OpenFromFile("../media/Kid_Mingus_Crash_Site_Tune.ogg"))
		return EXIT_FAILURE;
		
	// Play the music
	Music.Play();
	
	gge::SpriteAnimado anim;	
	
	//anim.AgregarSecuencia(sec);
	//anim.AgregarSecuencia(nuevaSecuencia());
	anim.CrearDeArchivo("../media/char_anim.xml");
	//llenarAnim(anim);
	
	
	sf::Vector2f pos(100.0f,150.0f);
	anim.CambiarPosicion(pos);
	
	anim.CambiarSecuencia("idle");
	//anim.SiguienteSecuencia("advance");
	anim.Animar();
	//anim.VoltearX(true);
	
	// Start the game loop
	int x;
	int moviendo=0;
	bool saltando=false;
	float velocidad =50;
	
	sf::Clock tiempo;
	tiempo.Reset();
	float alturaMax=80;
	
	while (App.IsOpened())
	{
		// Process events
		sf::Event Event;
		while (App.GetEvent(Event))
		{
			// Close window : exit
			if (Event.Type == sf::Event::Closed)
				App.Close();
			
			if (Event.Type == sf::Event::KeyPressed)
			{
				if (Event.Key.Code == sf::Key::Escape)
				{
					App.Close();
				}
			}

			if (App.GetInput().IsKeyDown(sf::Key::Up))
			{
				if (!saltando)
				{
					anim.CambiarSecuencia("saltar");
					if (moviendo>0)
					{
						anim.Invertir(true);
					}
					saltando=true;
					tiempo.Reset();
					x=0;
				}
			}
			
		}

		if (App.GetInput().IsKeyDown(sf::Key::Right))
		{
			moviendo=1;
		}
		else if (App.GetInput().IsKeyDown(sf::Key::Left))
		{
			moviendo=-1;
		}

		if (!saltando)
		{
			if (moviendo>0)
				anim.CambiarSecuencia("caminar");
			else if (moviendo<0)
				anim.CambiarSecuencia("retroceder");
				
			if (anim.SecuenciaTerminada()
				&& !App.GetInput().IsKeyDown(sf::Key::Left)
				&& !App.GetInput().IsKeyDown(sf::Key::Right))
			{
				anim.CambiarSecuencia("idle");
				moviendo=0;
			}
			
		}
		else
		{
			moviendo=moviendo>0? 3: moviendo<0? -3: 0;
			float posY = anim.ObtenerPosicion().y;
			float avanceY = alturaMax / (anim.SecuenciaActual()->duracion/2);
			if (tiempo.GetElapsedTime() < anim.SecuenciaActual()->duracion/2 )
				posY -= avanceY * App.GetFrameTime();
			else
				posY +=  avanceY * App.GetFrameTime();
			x++;

			sf::Vector2f pos(anim.ObtenerPosicion().x, posY);
			anim.CambiarPosicion(pos);
			
			if (anim.SecuenciaTerminada())
			{
				anim.CambiarSecuencia("idle");
				saltando=false;
				moviendo=0;
				anim.Invertir(false);
			}
		}
		
		if (anim.SecuenciaTerminada())
		{
			anim.Animar();
		}

		float posX = anim.ObtenerPosicion().x;
		posX +=moviendo*velocidad*App.GetFrameTime();
		
		sf::Vector2f pos(posX, anim.ObtenerPosicion().y);
		anim.CambiarPosicion(pos);

		// Clear screen
		App.Clear();
		// Draw the sprite
		App.Draw(Sprite);
		// Draw animated
		anim.Actualizar();

		App.Draw(anim.CuadroActual());
				
		// Draw the string
		App.Draw(Text);
		
		// Update the window
		App.Display();
		
	}
	
	return EXIT_SUCCESS;
}
